"""
订单页功能实现
"""
from flask import g
from flask import request, jsonify, current_app
from flask import session

from ihome import db
from ihome.models import User, Order, House
from ihome.utils.commons import login_required
from ihome.utils.response_code import RET
from . import order_blu
from datetime import datetime, timedelta


@order_blu.route("/orders", methods=["POST", "GET", "PUT"])
@login_required
def orders():
    """
    get请求，查看用户或房东的房间订单信息
    获取请求字符串参数  房客role =   房东role = landlord

    post请求，订单的提交

    put 请求  订单的接收或拒绝

    返回操作成功
    """
    # 获取用户登陆信息,
    user_id = g.user_id
    user = User.query.get(user_id)

    order = None  # 房源默认为None

    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="未登录")

    # 如果是 get 请求
    if request.method == "GET":
        landlord_house_order_list = []  # 每个房屋的所有订单,,所有订单
        data_get = request.args.get("role")
        if data_get not in ("custom", "landlord"):
            return jsonify(errno=RET.PARAMERR, errmsg="参数，错误")

        if data_get == "custom":
            # 用户的订单信息
            for order in user.orders:
                landlord_house_order_list.append(order.to_dict())

        else:  # data_get = "landlord" 查看用户作为房东的所有房屋及其预定订单信息

            # 房东的每个房屋 user.houses 下的所有订单添加到列表
            for landlord_house in user.houses:
                for order in landlord_house.orders:
                    landlord_house_order_list.append(order.to_dict())

        data = {
            "orders": landlord_house_order_list
        }

        return jsonify(errno=RET.OK, errmsg="操作成功", data=data)

    # post 请求
    elif request.method == "POST":
        # 获取参数，校验
        data_dict = request.json
        house_id = data_dict.get("house_id")  # 房源id
        start_date = data_dict.get("start_date")  # 订房开始日期
        end_date = data_dict.get("end_date")  # 订房结束日期

        if not all([house_id, start_date, end_date]):
            return jsonify(errno=RET.PARAMERR, errmsg="缺少参数")

        # 查询house_id对应的房源
        try:
            house = House.query.get(house_id)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="数据库查询错误")

        # 判断房源是否存在,
        if not house:
            # 如果请求的房源不存在 暂时设定为，id为1 的房源
            house = House.query.get(1)
            # return jsonify(errno=RET.NODATA, errmsg="房源不存在")

        # 把日期转为时间对象
        # start_date_obj = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')

        start_date_obj = datetime.strptime(start_date, '%Y-%m-%d')
        end_date_date_obj = datetime.strptime(end_date, '%Y-%m-%d')
        # 总天数
        day_sum = (end_date_date_obj - start_date_obj).days
        # 验证订购的日数是否违背 房源的入住日期限制（最少，最大入住天数暂定15）

        if day_sum <= 0 or day_sum >= 15:
            return jsonify(errno=RET.PARAMERR, errmsg="预定天数必须在%s到%s之间" % (house.min_days, 15))
        # # 生成一个订单对象
        order = Order()
        order.user_id = user.id
        order.house_id = house.id
        order.begin_date = start_date_obj
        order.end_date = end_date_date_obj
        order.days = day_sum
        order.house_price = house.price
        order.amount = day_sum * house.price

        try:
            db.session.add(order)
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="数据库保存订单错误")

        # # 当前房源的订单添加一个订单对象，以及预定数量加1，)
        house.orders.append(order)
        house.order_count += 1
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg="数据库添加房源订单错误")

        # 返回操作成功
        return jsonify(errno=RET.OK, errmsg="操作成功ojbk")

    # put 请求  处理房源 预定订单的接受，拒绝
    else:
        # 获取参数  接受/拒绝，订单号
        data_get_put = request.json
        order_id = data_get_put.get("order_id")
        action = data_get_put.get("action")

        if not all([order_id, action]):
            return jsonify(errno=RET.PARAMERR, errmsg="缺少参数")

        if action not in ("accept", "reject"):
            return jsonify(errno=RET.PARAMERR, errmsg="参数错误action")
        # 查询order_id 对应的订单
        try:
            order = Order.query.get(order_id)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="数据库查询订单错误")

        if action == "accept":
            # 接受订单 修改订单状态为"WAIT_PAYMENT"(待支付状态)
            order.status = "WAIT_PAYMENT"
            # order.status = "COMPLETE"  # 已完成状态D
            # order.status = "WAIT_COMMENT"  # 待评价状态
        else:
            # 拒绝订单 接收参数：订单拒绝原因
            reason = data_get_put.get("reason")
            if not reason:
                return jsonify(errno=RET.PARAMERR, errmsg="请输入拒绝原因")

            # 拒绝订单 修改订单状态为"REJECTED"(已拒绝)，添加属性comment(订单被拒的原因或订单评论)
            order.status = "REJECTED"
            order.comment = reason
        try:
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="数据库修改订单状态出错误")



        return jsonify(errno=RET.OK, errmsg="操作成功ojbk")


@order_blu.route("/houses/<house_id>", methods=["POST", "GET"])
def houses(house_id):
    """
    准备预定房源的界面
    获取参数
    返回数据
    """
    # 获取用户登陆信息, 如果没有登陆暂时认为用户id为7 的用户登陆了
    user_id = g.user_id
    user = User.query.get(user_id)

    # 如果没有登陆返回提醒用户登陆
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="未登录")

    house = House.query.get(house_id)
    # 如果没有就假定房源信息为房源id为1的房源信息
    if not house:
        return jsonify(errno=RET.NODATA, errmsg="没有该房源")

    data = {
        "house": house.to_full_dict()
    }
    # 返回数据
    return jsonify(errno=RET.OK, errmsg="操作成功", data=data)


@order_blu.route("/orders/comment", methods=["PUT", "POST"])  # methods
@login_required
def comment():
    """
    处理订单 评论

    """
    # 获取用户登陆信息,
    user_id = g.user_id
    user = User.query.get(user_id)
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="未登录")

        # 获取参数 评论id 评论内容
    data_put = request.json
    order_id = data_put.get("order_id")
    comment = data_put.get("comment")
    if not all([order_id, comment]):
        return jsonify(errno=RET.PARAMERR, errmsg="缺少参数")

    # 查找订单对象
    order = Order.query.get(order_id)

    if not order:
        return jsonify(errno=RET.NODATA, errmsg="订单不存在")

    # 修改评论对象属性，内容,状态(改为COMPLETE已完成) 提交到数据库
    order.comment = comment
    order.status = "COMPLETE"
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库修改订单评论出错误")

    # 返回操作成功
    return jsonify(errno=RET.OK, errmsg="ojbk的评论")
